//引入公共方法
const Common = require('./common')
//引入表对应的实体模型
const EventModel = require('../models/event')
const CateModel = require('../models/cate')
const CaseModel = require('../models/case')
const OrderModel = require('../models/order')
const CompanyModel = require('../models/company')
const ArticleModel = require('../models/article')
//引入常量模块
const Constant = require('../constant/constant')
//引入日期格式化模块
const dateFormat = require('dateformat')
const { checkToken } = require('../utils/checkToken')
const { getParams } = require('../utils/getParams')
const CaseListModel = require('../models/caselist')
const { Op } = require('sequelize')
const formidable = require('formidable')
const path = require('path')
//配置对象
let exportObject = {
  //获得活动列表
  eventList1,
  //获得企业信息
  getCompanyInfo,
  //添加预约的接口
  createOrder,
  caseCompany,
  //获得所有分类列表的函数
  getCatelist,
  //根据分类分页查找文章列表
  getArticleList,
  //根据id获得文章详情
  getArticleDetailById,
  //或案例的分页数据
  getCaseList,
  //
  getCases,
  addCase,
  upload,
  getCaseByPk,
  updateCase,
  deleteCaseById,
}
module.exports = exportObject
function deleteCaseById(req, res) {
  //1、验证token
  if (!checkToken(req, res)) {
    return
  }
  //2、获得参数对象
  let params = getParams(req)
  if (!params) {
    let obj = Common.clone(Constant.LACK)
    obj.msg = '请传递参数'
    return res.send(obj)
  }
  //3、返回值对象
  let resObj = Common.clone(Constant.DEFAULT_SUCCESS)
  //4、查询任务
  let tasks = {
    checkParams(cb) {
      Common.checkParams(params, ['id'], cb)
    },
    query: [
      'checkParams',
      (results, cb) => {
        CaseListModel.destroy({ where: { id: params.id } })
          .then((v) => {
            if (v) {
              resObj.data = v
              resObj.msg = '删除数据成功'
            } else {
              resObj.data = null
              resObj.msg = '删除数据失败'
              resObj.code = 400
            }
            cb(null)
          })
          .catch((e) => {
            console.error(e)
            cb(Constant.DEFAULT_ERROR)
          })
      },
    ],
  }
  //5、返回数据
  Common.autoFn(tasks, res, resObj)
}
//通过id修改案例
function updateCase(req, res) {
  //1、验证token
  if (!checkToken(req, res)) {
    return
  }
  //2、获得参数对象
  let params = getParams(req)
  if (!params) {
    let obj = Common.clone(Constant.LACK)
    obj.msg = '请传递参数'
    return res.send(obj)
  }
  //3、返回值对象
  let resObj = Common.clone(Constant.DEFAULT_SUCCESS)
  //4、查询任务
  let tasks = {
    checkParams(cb) {
      Common.checkParams(params, ['id'], cb)
    },
    query: [
      'checkParams',
      (results, cb) => {
        CaseListModel.update(
          {
            name: params.name,
            fit_type: params.fit_type,
            house_type: params.house_type,
            area: params.area,
            price: params.price,
            views: params.views,
            updated_at: dateFormat(params.updated_at, 'yyyy-mm-dd HH:MM:ss'),
            img: params.img,
          },
          { where: { id: params.id } }
        )
          .then((v) => {
            if (v) {
              resObj.data = v
              resObj.msg = '修改数据成功'
            } else {
              resObj.data = null
              resObj.msg = '修改数据失败'
              resObj.code = 400
            }
            cb(null)
          })
          .catch((e) => {
            console.error(e)
            cb(Constant.DEFAULT_ERROR)
          })
      },
    ],
  }
  //5、返回数据
  Common.autoFn(tasks, res, resObj)
}
//通过id查询案例详情
function getCaseByPk(req, res) {
  //1、验证token
  if (!checkToken(req, res)) {
    return
  }
  //2、获得参数对象
  let params = getParams(req)
  if (!params) {
    let obj = Common.clone(Constant.LACK)
    obj.msg = '请传递参数'
    return res.send(obj)
  }
  //3、返回值对象
  let resObj = Common.clone(Constant.DEFAULT_SUCCESS)
  //4、查询任务
  let tasks = {
    checkParams(cb) {
      Common.checkParams(params, ['id'], cb)
    },
    query: [
      'checkParams',
      (results, cb) => {
        CaseListModel.findByPk(params.id)
          .then((v) => {
            if (v) {
              resObj.data = v
              resObj.msg = '请求数据成功'
            } else {
              resObj.data = null
              resObj.msg = '请求数据不存在'
              resObj.code = 404
            }
            cb(null)
          })
          .catch((e) => {
            //查询失败的函数
            console.error(e)
            cb(Constant.DEFAULT_ERROR)
          })
      },
    ],
  }
  //5、返回数据
  Common.autoFn(tasks, res, resObj)
}
//添加
function upload(req, res) {
  //1、验证token
  if (!checkToken(req, res)) {
    return
  }
  //2、获得请求对象
  let form = new formidable.IncomingForm()
  //3、定义字符集
  form.encoding = 'utf-8'
  //4、指定上传文件的目录
  let pt = __dirname.substring(0, __dirname.lastIndexOf('\\'))
  let uploadPath = path.join(pt + `\\public\\upload`)
  form.uploadDir = uploadPath
  //5、是否保留后置
  form.keepExtensions = true
  //6、设置文件的大小2M
  form.maxFileSize = 2 * 1024 * 1024
  //7、创建文件
  let files = {}
  form
    .on('file', function (field, file) {
      //8、监听file表单域的接收过程
      let pathName = file.path
      pathName = '/upload' + '/' + pathName.substring(pathName.lastIndexOf('\\') + 1)
      files['path'] = pathName
    })
    .on('error', function (err) {
      //9、监听文件上传失败执行的结果
      res.json({ msg: '上传失败', code: 400, data: err.message })
    })
    .on('end', function () {
      //10、监听文件执行结束执行的操作
      res.json({ msg: '上传成功', code: 200, data: files })
    })
  //11、form开始解析req参数
  form.parse(req)
}

//添加案例操作
function addCase(req, res) {
  //1、验证token
  let flag = checkToken(req, res)
  if (!flag) {
    return
  }
  //2、获得参数对象
  let params = getParams(req)
  if (!params) {
    let obj = Common.clone(Constant.LACK)
    obj.msg = '请传递参数'
    return res.send(obj)
  }
  //3、返回值对象
  let resObj = Common.clone(Constant.DEFAULT_SUCCESS)
  //4、创建任务对象
  let tasks = {
    checkParams(cb) {
      Common.checkParams(params, ['name', 'price', 'img', 'area', 'fitType', 'houseType'], cb)
    },
    query: [
      'checkParams',
      (resutls, cb) => {
        CaseListModel.create({
          img: params.img,
          name: params.name,
          house_type: params.houseType,
          fit_type: params.fitType,
          area: params.area,
          price: params.price,
          views: 0,
          created_at: dateFormat(new Date(), 'yyyy-mm-dd HH:MM:ss'),
          updated_at: dateFormat(new Date(), 'yyyy-mm-dd HH:MM:ss'),
        })
          .then((v) => {
            if (v) {
              resObj.data = v
              resObj.msg = '添加案例成功'
            } else {
              resObj.data = 0
              resObj.msg = '添加案例失败'
              resObj.code = 400
            }
            cb(null)
          })
          .catch((err) => {
            console.error(err)
            cb(Constant.DEFAULT_ERROR)
          })
      },
    ],
  }
  //5、返回数据
  Common.autoFn(tasks, res, resObj)
}

//分页查询案例列表
function getCases(req, res) {
  //1、验证token
  let flag = checkToken(req, res)
  if (!flag) {
    return
  }
  //2、获得参数对象
  let params = getParams(req)
  if (!params) {
    let obj = Common.clone(Constant.LACK)
    obj.msg = '请传递参数'
    return res.send(obj)
  }
  //3、返回值对象
  let resObj = Common.clone(Constant.DEFAULT_SUCCESS)
  //4、创建查询任务
  let tasks = {
    //4.1 验证参数是否有
    checkParams(cb) {
      Common.checkParams(params, ['page', 'rows'], cb)
    },
    //4.2 执行查询操作
    query: [
      'checkParams',
      (results, cb) => {
        //4.3 对所有参数的数据类型进行验证 validateGetCasesParams(params,cb)
        let res = Common.validateGetCasesParams(params, cb)
        if (!res) {
          return
        }
        //4.4 组织参数
        let where = {}
        let { houseType, fitType, area, price, name } = params
        if (houseType) {
          where['house_type'] = houseType
        }
        if (fitType) {
          where['fit_type'] = fitType
        }
        if (area) {
          where['area'] = { [Op.gte]: area }
        }
        if (price) {
          where['price'] = { [Op.gte]: price }
        }
        if (name) {
          where['name'] = { [Op.substring]: name }
        }
        let offset = (+params.page - 1) * +params.rows
        let limit = +params.rows
        CaseListModel.findAndCountAll({
          where,
          limit,
          offset,
          order: [['created_at', 'desc']],
        })
          .then((v) => {
            if (!v.count) {
              resObj.data = null
              resObj.code = 400
              resObj.msg = '没有你要查询的数据'
            } else {
              resObj.data = v
              resObj.msg = '查询案例列表成功'
            }
            cb(null)
          })
          .catch((e) => {
            console.error(e)
            cb(Constant.DEFAULT_ERROR)
          })
      },
    ],
  }
  //5、返回数据
  Common.autoFn(tasks, res, resObj)
}

/**
 * 1、获得所有的活动的列表信息
 * @date 2021-03-18
 * @param {any} req
 * @param {any} res
 * @returns {any}
 */
function eventList1(req, res) {
  //1、如果验证token没有通过
  if (!checkToken(req, res)) {
    return
  }
  //2、创建一个返回值对象
  let resObj = Common.clone(Constant.DEFAULT_SUCCESS)
  //3、创建一个异步任务，执行数据查询和封装
  let tasks = {
    //3.2 查询操作
    query(cb) {
      //3.4 执行查询操作
      EventModel.findAll()
        .then(
          //result是一个查询到数组
          (result) => {
            //保存数据到数组中
            let list = []
            result.forEach((v) => {
              let obj = {
                id: v.id,
                name: v.name,
                img: v.img,
                url: v.url,
                articleId: v.articleId,
                createdAt: dateFormat(v.createdAt, 'yyyy-mm-dd HH:MM:ss'),
              }
              list.push(obj)
            })
            resObj.code = 200
            resObj.msg = '活动列表获得成功'
            resObj.data = { list }
            //放行
            cb(null)
          }
        )
        .catch((error) => {
          console.log(error)
          //返回错误信息到async方法中
          cb(Constant.DEFAULT_ERROR)
        })
    },
  }
  //4、返回数据
  Common.autoFn(tasks, res, resObj)
}

/**
 * 2、获得所有分类列表的函数
 * @date 2021-03-19
 * @param {any} req
 * @param {any} res
 * @returns {any}
 */
function getCatelist(req, res) {
  //1、验证token
  let flag = checkToken(req, res)
  if (!flag) {
    return
  }
  //2、获得一个返回值对象
  let resObj = Common.clone(Constant.DEFAULT_SUCCESS)
  //3、开启一个异步查询任务
  let tasks = {
    query(cb) {
      CateModel.findAll()
        .then((results) => {
          // results 是查询到的一张表格
          let list = []
          results.forEach((v) => {
            let obj = {
              id: v.id,
              name: v.name,
              img: v.img,
              createdAt: dateFormat(v.createdAt, 'yyyy-mm-dd HH:MM:ss'),
              updatedAt: dateFormat(v.updatedAt, 'yyyy-mm-dd HH:MM:ss'),
            }
            list.push(obj)
          })
          //组装resObj对象
          resObj.msg = '请求分类列表成功'
          resObj.data = { cateList: list }
          //放行
          cb(null)
        })
        .catch((err) => {
          console.error(err)
          //放行
          cb(Constant.DEFAULT_ERROR)
        })
    },
  }
  //4、执行任务，返回数据
  Common.autoFn(tasks, res, resObj)
}

/**
 * 3、根据分类分页查找文章列表
 * @date 2021-03-22
 * @param {any} req
 * @param {any} res
 */
function getArticleList(req, res) {
  //1、检查token
  let flag = checkToken(req, res)
  if (!flag) {
    return
  }
  //2、获得参数
  let params = getParams(req)
  if (!params) {
    let obj = Common.clone(Constant.LACK)
    obj.msg = '请传递参数'
    return res.send(obj)
  }
  //3、获得返回对象
  let resObj = Common.clone(Constant.DEFAULT_SUCCESS)
  //4、创建一个任务
  let tasks = {
    // 4.1 执行参数的验证
    checkParams(cb) {
      //cateId分类的id, page当前页码，row一页几条
      Common.checkParams(params, ['cateId', 'page', 'rows'], cb)
    },
    // 4.2 执行查询
    query: [
      // 4.2.1 执行参数验证
      'checkParams',
      // 4.2.2 使用模型执行查询操作
      (results, cb) => {
        //查询数据的起始行号
        let offset = (+params.page - 1) * params.rows
        let limit = +params.rows
        console.log(offset, limit)
        //查询总条数和当前页的列表数据
        ArticleModel.findAndCountAll({
          where: {
            cate: +params.cateId,
          },
          offset,
          limit,
          order: [['created_at', 'desc']],
          include: CateModel,
        })
          .then(function (result) {
            let list = []
            result.rows.forEach((item, index) => {
              let obj = {
                id: item.id,
                title: item.title,
                desc: item.desc.substring(0, 60) + '...',
                cover: item.cover,
                content: item.content,
                cateName: item.Cate.name,
                createdAt: dateFormat(item.createdAt, 'yyyy-mm-dd HH:MM:ss'),
              }
              list.push(obj)
            })
            resObj.code = 200
            resObj.data = { list, count: result.count }
            resObj.msg = '查询分类文章列表成功'
            //放行
            cb(null)
          })
          .catch(function (err) {
            console.error(err)
            //放行
            cb(Constant.DEFAULT_ERROR)
          })
      },
    ],
  }
  //5、执行返回数据操作
  Common.autoFn(tasks, res, resObj)
}

//4、根据id获得文章详情的函数
function getArticleDetailById(req, res) {
  //1、验证token
  let flag = checkToken(req, res)
  if (!flag) {
    return
  }
  //2、获得参数
  let params = getParams(req)
  if (!params) {
    return res.send(Constant.LACK)
  }
  //3、获得返回值对象
  let resObj = Common.clone(Constant.DEFAULT_SUCCESS)
  //4、创建异步任务
  let tasks = {
    //4.1 验证参数的函数
    checkParams(cb) {
      Common.checkParams(params, ['articleId'], cb)
    },
    //4.2 执行查询操作
    query: [
      'checkParams',
      (results, cb) => {
        //results=null表示checkParams函数验证参数成功
        ArticleModel.findByPk(params.articleId, { include: [{ model: CateModel }] })
          .then((v) => {
            //查询成功的函数 ，v是查询结果 要么是一个对象，要么null
            console.log(v)
            if (v) {
              resObj.data = {
                id: v.id,
                title: v.title,
                desc: v.desc,
                cover: v.cover,
                content: v.content,
                cate: v.cate,
                //获取联表查询中的cate表中的name
                cateName: v.Cate.cateName,
                createdAt: dateFormat(v.createdAt, 'yyyy-mm-dd HH:MM:ss'),
              }
              resObj.msg = '查询成功'
            } else {
              resObj.data = null
              resObj.msg = '没有此id=' + params.articleId + '的文章详情'
              resObj.code = 404
            }
            //一定要放行
            cb(null)
          })
          .catch((err) => {
            //查询失败的函数
            console.error(err)
            cb(Constant.DEFAULT_ERROR)
          })
      },
    ],
  }
  //5、响应数据
  Common.autoFn(tasks, res, resObj)
}

//5、获得案例列表的函数
function getCaseList(req, res) {
  //1、检查token
  if (!checkToken(req, res)) {
    return
  }
  //2、检查参数
  let params = getParams(req)
  if (!params) {
    return res.send(Constant.LACK)
  }
  //3、获得resObj对象
  let resObj = Common.clone(Constant.DEFAULT_SUCCESS)
  //4、创建任务对象
  let tasks = {
    checkParams(cb) {
      Common.checkParams(params, ['page', 'rows'], cb)
    },
    query: [
      'checkParams',
      (results, cb) => {
        let offset = (params.page - 1) * +params.rows
        let limit = +params.rows
        CaseModel.findAndCountAll({
          limit,
          offset,
          order: [['created_at', 'desc']],
        })
          .then((v) => {
            let list = []
            //v.rows才是数组
            if (!v || v.rows.length === 0) {
              //没有数据
              resObj.data = null
              resObj.msg = '当前第' + params.page + '页，没有数据'
              resObj.code = 404
            } else {
              v.rows.forEach((item) => {
                let obj = {
                  id: item.id,
                  name: item.name,
                  img: item.img,
                  desc: item.desc,
                  content: item.content,
                  createdAt: dateFormat(item.createdAt, 'yyyy-mm-dd HH:MM:ss'),
                }
                list.push(obj)
              })
              resObj.data = { list, count: v.count }
              resObj.msg = '查询案例列表成功'
            }
            cb(null)
          })
          .catch((e) => {
            console.error(e)
            cb(Common.DEFAULT_ERROR)
          })
      },
    ],
  }
  //5、返回数据
  Common.autoFn(tasks, res, resObj)
}

//6、获得企业信息的函数
function getCompanyInfo(req, res) {
  //1、检查token
  if (!checkToken(req, res)) {
    return
  }
  //2、
  let resObj = Common.clone(Constant.DEFAULT_SUCCESS)
  //3、
  let tasks = {
    query(cb) {
      CompanyModel.findAll()
        .then((v) => {
          //v是数组
          if (!v || v.length === 0) {
            cb(Constant.COMPANY_NOT_EXSIT)
          } else {
            let list = []
            v.forEach((item) => {
              let obj = {
                id: item.id,
                name: item.name,
                address: item.address,
                tel: item.tel,
                intro: item.intro,
                longitude: item.longitude,
                latitude: item.latitude,
                createdAt: dateFormat(item.createdAt, 'yyyy-mm-dd HH:MM:ss'),
              }
              list.push(obj)
            })
            resObj.data = list
            resObj.msg = '请求公司信息成功'
          }
          cb(null)
        })
        .catch((e) => {
          console.error(e)
          cb(Constant.DEFAULT_ERROR)
        })
    },
  }
  //4、
  Common.autoFn(tasks, res, resObj)
}
//7、添加预约的函数
function createOrder(req, res) {
  if (!checkToken(req, res)) {
    return
  }
  let params = getParams(req)
  if (!params) {
    return res.send(Constant.LACK)
  }
  let resObj = Common.clone(Constant.DEFAULT_SUCCESS)
  let tasks = {
    //1、参数拦截
    checkParams(cb) {
      Common.checkParams(params, ['name', 'phone', 'type', 'orderDate', 'message'], cb)
    },
    //2、执行查询
    query: [
      'checkParams',
      (results, cb) => {
        OrderModel.create({
          name: params.name,
          phone: params.phone,
          type: params.type,
          orderDate: dateFormat(params.orderDate, 'yyyy-mm-dd HH:MM:ss'),
          message: params.message,
          createdAt: dateFormat(new Date(), 'yyyy-mm-dd HH:MM:ss'),
          updatedAt: dateFormat(new Date(), 'yyyy-mm-dd HH:MM:ss'),
        })
          .then((v) => {
            if (!v) {
              resObj.data = v
              resObj.msg = '添加预约失败'
              resObj.code = 400
            } else {
              resObj.data = v
              resObj.msg = '添加预约成功'
            }
            cb(null)
          })
          .catch((e) => {
            console.error(e)
            cb(Constant.DEFAULT_ERROR)
          })
      },
    ],
  }
  Common.autoFn(tasks, res, resObj)
}

//8、获得案例详情的函数
function caseCompany(req, res) {}
